package com.navicoa.e_libreria.utiles;

import java.sql.Connection;
import java.sql.SQLException;

import com.navicoa.e_libreria.presentacion.InicioAplicacion;

public class AsistenteDeConexion implements Runnable {
	
	private static AsistenteDeConexion adc = null;
	private static Connection c = null;
	private static Thread t;
	
	private AsistenteDeConexion(){
		t = new Thread(this);
		
		t.start();
	}
	
	public synchronized static void lanzar(){
		if(adc == null)
			adc = new AsistenteDeConexion();
	}
	
	public static boolean getEstadoConexion(){
		boolean res = true;
		
		if(c != null){
			try {
				if(c.isClosed()){
					res = false;
				}

				if(!c.isValid(1)){
					res = false;
				}
			} catch (SQLException e) {
				// TODO Bloque catch generado automáticamente
				e.printStackTrace();
			}
		}
		else{
			res = false;
		}
		
		if(!res){
			//Detectada Caida Base de datos: Lanzandola de nuevo
			try{
				establecerConexion();
			}
			catch(Exception e){
				
			}
		}
		
		return res;
	}
	
	private static void establecerConexion(){
		if(c == null){
			c = AdministradorConexion.getAdministrador().checkOut();
		}
		else{
			
			try {
				if(c.isClosed()){
					c = AdministradorConexion.getAdministrador().checkOut();
				}
				
				if(!c.isValid(1)){
					c = AdministradorConexion.getAdministrador().checkOut();
				}
			} catch (SQLException e) {
				// TODO Bloque catch generado automáticamente
				e.printStackTrace();
			}
		}
	}
	
	public synchronized static Connection getConexion(){
						
		return c;
	}
	
	public void run(){
		establecerConexion();
		
		while(true){

			InicioAplicacion.conexion(AsistenteDeConexion.getEstadoConexion());
						
			try{
				Thread.sleep(500);
			}catch(InterruptedException e){
				
			}
		}
	}
}
